home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 001-025 / disk_006 / setparallel / setparallel.c < prev   
C/C++ Source or Header  |  1992-05-06  |  7KB  |  230 lines

  1. /*
  2.  *
  3.  *    DISCLAIMER:
  4.  *
  5.  *    This program is provided as a service to the programmer
  6.  *    community to demonstrate one or more features of the Amiga
  7.  *    personal computer.  These code samples may be freely used
  8.  *    for commercial or noncommercial purposes.
  9.  * 
  10.  *     Commodore Electronics, Ltd ("Commodore") makes no
  11.  *    warranties, either expressed or implied, with respect
  12.  *    to the program described herein, its quality, performance,
  13.  *    merchantability, or fitness for any particular purpose.
  14.  *    This program is provided "as is" and the entire risk
  15.  *    as to its quality and performance is with the user.
  16.  *    Should the program prove defective following its
  17.  *    purchase, the user (and not the creator of the program,
  18.  *    Commodore, their distributors or their retailers)
  19.  *    assumes the entire cost of all necessary damages.  In 
  20.  *    no event will Commodore be liable for direct, indirect,
  21.  *    incidental or consequential damages resulting from any
  22.  *    defect in the program even if it has been advised of the 
  23.  *    possibility of such damages.  Some laws do not allow
  24.  *    the exclusion or limitation of implied warranties or
  25.  *    liabilities for incidental or consequential damages,
  26.  *    so the above limitation or exclusion may not apply.
  27.  *
  28.  */
  29.  
  30. /* SetParallel allows the CLI user to dynamically change any particular
  31.  * parallel port parameter.
  32.  *
  33.  * July 6, 1985  Version 1.0  Keith Stobie  Initial version (serial)
  34.  * Aug 16, 1985  Version 1.1  Tom Pohorsky  cloned for parallel
  35.  *
  36.  */
  37. char *prog_name;            /* Name of program being run */
  38. char *prog_version = "1.0"; /* Version of the program */
  39.  
  40. #include        <exec/types.h>
  41. #include        <exec/nodes.h>
  42. #include        <exec/lists.h>
  43. #include        <exec/memory.h>
  44. #include        <exec/ports.h>
  45. #include        <exec/libraries.h>
  46. #include        <exec/devices.h>
  47. #include        <exec/tasks.h>
  48. #include        <exec/io.h>
  49. #include        <devices/parallel.h>
  50.  
  51.  
  52.  
  53. extern struct MsgPort *CreatePort();
  54.  
  55. set_parallel( index, value )
  56.    int   index;         /* which parameter to set */
  57.    ULONG value;      /* The new value for paramter */
  58. {
  59.     struct IOExtPar IORpar;      /* Parallel port IO request block */
  60.     int     error = 0;
  61.     int     return_code = 0;
  62.     
  63.     IORpar.io_ParFlags |= PARF_SHARED;
  64.     if ((error = OpenDevice (PARALLELNAME, 0, &IORpar, 0)) != 0) {
  65.         printf( "Unable to open Parallel Device, error=%ld\n", error );
  66.         return 20;
  67.     }
  68.  
  69.     IORpar.IOPar.io_Flags   = 0;
  70.     IORpar.IOPar.io_Command = PDCMD_QUERY;
  71.     if ((error = DoIO( &IORpar )) != 0) {
  72.         printf( "Parallel Device query error=%ld\n", error );
  73.         return 20;
  74.     }
  75.  
  76.     /* SET UP the read message port in the I/O request */
  77.     if ((IORpar.IOPar.io_Message.mn_ReplyPort = CreatePort( "SetParallel", 0 ))
  78.          == NULL) {
  79.         printf( "Unable to create port for IO message\n" );
  80.         CloseDevice( &IORpar );
  81.         return 20;
  82.       }
  83.  
  84.     switch( index ) {
  85.       case 0:    print_request( &IORpar );         break;
  86.       case 1:    IORpar.io_ParFlags      = value;  break;
  87.       case 2:    IORpar.io_PTermArray.PTermArray0 = value;
  88.                  /* ARRAY CAN BE SET ONLY IF EOFMODE */
  89.                  /* SO SET MODE (x02) FROM CASE 1 */
  90.                  /* fill out array with lowest valid value */
  91.                  value = value & 0xFF;
  92.                  IORpar.io_PTermArray.PTermArray1 
  93.                      = value<<24 & value<<16 & value<<8 & value;
  94.                  break;
  95.  
  96.       default:   printf( "Index value %ld is not in range 0-2!\n", index );
  97.                  IORpar.IOPar.io_Error = 0;
  98.                  return_code = 10;   
  99.                  goto cleanup;
  100.     } /* switch */
  101.  
  102.     IORpar.IOPar.io_Flags   = 0;
  103.     IORpar.IOPar.io_Command = PDCMD_SETPARAMS;
  104.     error = DoIO( &IORpar );
  105. cleanup:
  106.     DeletePort( IORpar.IOPar.io_Message.mn_ReplyPort );
  107.     CloseDevice( &IORpar );
  108.     if (error) {
  109.        printf( "Error %ld doing IO to set params!\n", error );
  110.        return 10;
  111.     }
  112.       
  113.     if (IORpar.IOPar.io_Error) {
  114.        printf( "Error %ld from parallel device doing set params!\n"
  115.              , IORpar.IOPar.io_Error );
  116.        return 10;
  117.     }
  118.  
  119.     return (return_code);
  120. }  /* set_parallel() */
  121.  
  122.  
  123.  
  124. print_request( IORpar )
  125.     struct IOExtPar *IORpar;     /* Parallel port IO request block */
  126. {
  127. #define PRINT( field )     printf( "     %s = %8lx %8ld\n"\
  128.                                  , "field", IORpar->field, IORpar->field)
  129. #define IPRINT( index, field ) printf( " %2ld  %s = %8lx %8ld\n" \
  130.                                , index, "field", IORpar->field, IORpar->field)
  131.  
  132.       printf( "index field name       hexadec  decimal\n" ); 
  133.       IPRINT( 1, io_ParFlags  );
  134.       IPRINT( 2, io_PTermArray.PTermArray0 );
  135.           PRINT( io_PTermArray.PTermArray1 );
  136.       printf( "\n" );   /* Not associated with an index */
  137.           PRINT( io_Status    );
  138. }  /* print_request() */
  139.  
  140.  
  141. print_usage() {
  142.    printf("%s: version %s\n", prog_name, prog_version );
  143.    printf("usage: %s <index> <value>\n", prog_name );
  144.    printf("  <index> is a decimal number indicating which parameter.\n" );
  145.    printf("          0 indicates print current values (and indexes) \n");
  146.    printf("            without changing them.\n" );
  147.    printf("  <value> number to set the indexed parameter to.\n");
  148.    printf("          value should be in decimal unless it starts with X\n" );
  149.    printf("          or x in which case the number should be hexadecimal\n");
  150.    exit( 5 );
  151. }
  152.  
  153.  
  154.  
  155. ULONG get_hex( s )
  156.    char *s;    /* String with hex digits */
  157. {
  158.    ULONG num=0;
  159.  
  160.    for (;*s != '\0'; s++) {
  161.       switch( *s ) {
  162.          case '0': case '1': case '2': case '3': case'4':
  163.          case '5': case '6': case '7': case '8': case'9':
  164.             num = num*16 + *s - '0'; break;
  165.          case 'a': case 'b': case 'c': case 'd': case'e': case'f':
  166.             num = num*16 + 10 + *s - 'a'; break;
  167.          case 'A': case 'B': case 'C': case 'D': case'E': case'F':
  168.             num = num*16 + 10 + *s - 'A'; break;
  169.          default: return num;    /* return what we found */
  170.       }
  171.    }
  172.  
  173.    return num;
  174. }  /* get_hex() */
  175.  
  176.  
  177. int get_dec( s )
  178.    char *s;    /* String with hex digits */
  179. {
  180.    int num=0;
  181.  
  182.    for (;*s != '\0'; s++) {
  183.       switch( *s ) {
  184.          case '0': case '1': case '2': case '3': case'4':
  185.          case '5': case '6': case '7': case '8': case'9':
  186.             num = num*10 + *s - '0'; break;
  187.          default: return num;    /* return what we found */
  188.       }
  189.    }
  190.  
  191.    return num;
  192. }  /* get_dec() */
  193.  
  194.  
  195.  
  196.  
  197. main( argc, argv ) 
  198.    int argc;
  199.    char *argv[];
  200. {
  201.    int   index;
  202.    ULONG value;
  203.  
  204.    if (argc <=0 ) { prog_name = "SetParallel"; }
  205.    else { prog_name = argv[0];}
  206.  
  207.    if (argc == 1) { print_usage(); }
  208.  
  209.    if (argc < 2 ) { printf( "Too few parameters\n" ); print_usage();}
  210.    if (argc > 3 ) { printf( "Too many parameters\n" ); print_usage();}
  211.  
  212.    index = get_dec( *++argv );
  213.  
  214.    if ((index != 0) && (argc < 3)) {
  215.       printf( "Too few parameters\n" ); print_usage();
  216.    }
  217.  
  218.    if (argc == 3) { 
  219.       ++argv;
  220.       if ((*argv[0] == 'x') || (*argv[0] == 'X')) {
  221.          value = get_hex( *argv + 1 ); /* Skip x or X */
  222.       } else {
  223.          value = get_dec( *argv );
  224.       }
  225.    }
  226.  
  227.    exit( set_parallel( index, value ) ); 
  228.    
  229. }  /* main() */
  230.